Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MVC 구현하기 - 3단계] 히이로(문제웅) 미션 제출합니다. #587

Merged
merged 3 commits into from
Sep 25, 2023

Conversation

MoonJeWoong
Copy link

안녕하세요 무민, 히이로입니다!

전에 말씀드린대로 최대한 빠르게 진행해봤습니다.
혹시 빠뜨린 부분이 있다면 리뷰 부탁드릴게요 ㅎㅎ...

가장 궁금했던 점은 DispatcherServletInitializer는 왜 app 패키지 내에 존재해야 제대로 초기화가 진행되는가 입니다. 나름대로 디버깅을 찍어보면서 알아보려다가 시간 문제로 일단 리뷰 요청을 드리게 되었는데 무민에게도 한 번 질문드려보고 싶습니다. 😄

그리고 디스패처 서블릿이나 view에 대한 테스트 코드는 리팩토링 하면서 함께 작성해보도록 하겠습니다!
감사합니다~!! 🙇

Copy link
Member

@parkmuhyeun parkmuhyeun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 히이로 🙌 마지막까지 깔끔하게 잘 마무리 해주셨네요!

3단계는 딱히 코멘트 할 부분이 안 보여 질문하신 것에 답변 후 머지시키려고 합니다.(view나 DispatcherServlet의 테스트는 요구사항에 포함되진 않으니 딱히 상관없을 것 같아요.)

1, 2, 3단계 모두 고생많으셨습니다. 다음 미션도 화이팅입니다~


질문하신 부분은 저도 미션하면서 고민해봤던 부분인데요! 추적하면서 공부한 내용들 공유해드려요.

우선 ServletInitializer가 어디서 초기화 되는가를 추적해서 올라가면

톰캣의 apache.catalina.startup 패키지의 ContextConfig 클래스가 나옵니다. 해당 부분에서 설정들을 주입하는 게 보이는데 우선 1299줄에서 processServletContainerInitializers() 메서드를 실행시켜 ServletContainerInitializer의 구현체들을 먼저 찾습니다.

image

해당 메서드를 들어가보면 1834번째 줄에 loader.load를 통해 servletContainerInitializer.class를 로드하는데 이때, 구현체인 SpringServletContainerInitializer와 JasperInitializer가 로드됩니다.

image

그 아래부분에서는 찾은 initializer(SpringServletContainerInitializer)에 맞는 handlesType(WebApplicationInitializer)도 찾아줍니다.

image

그 다음에 1304번째 줄에서 드디어 우리가 찾던 DispatcherServletInitializer를 초기화시켜주는데요.

image

어떻게 이게 가능한가? 하고 해당 메서드를 들어가면 SpringServletContainerInitializer(initializer)가 가지고있는 @HandlesType(WebApplicationInitializer.class
)을 보고 1391번째 줄에 있는 path(“/WEB-INF/classes”)를 읽어 해당 type의 구현체(DispatcherServlet)가 있으면 초기화시켜주게 됩니다.

image

image

그래서 다른 곳으로 옮기면 해당 경로에 없기 때문에 초기화되지 않습니다. 만약 다른 곳으로 옮겨주려면 추가적인 작업이 필요할 것 같아요.

@parkmuhyeun parkmuhyeun merged commit 85feba4 into woowacourse:moonjewoong Sep 25, 2023
1 check passed
@parkmuhyeun
Copy link
Member

궁금한게 있으시다면 DM주세요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants